home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / e / amigae33a.lha / E_v3.3a / Src.lha / Src / Gfx / Chunky3d / rr.e < prev    next >
Text File  |  1996-11-02  |  7KB  |  227 lines

  1. -> "Rude Racing" or "Wreckless Driving" or "The Need For Traffic Jams"
  2. -> see main() below for the controls.
  3.  
  4. OPT OSVERSION=39, PREPROCESS
  5.  
  6. CONST CWIDTH=256,CHEIGHT=128
  7. CONST SCHEIGHT=CHEIGHT+20
  8. CONST TEMPBUFS=CWIDTH*CHEIGHT/2,BUFS=CWIDTH*CHEIGHT
  9.  
  10. MODULE '*c2p4', '*screenmodereq_db', 'tools/exceptions', 'tools/scrbuffer',
  11.        'intuition/screens', 'graphics/rastport', 'graphics/gfx',
  12.        'intuition/intuition'
  13.  
  14. /*------------------------------------------------------------------------*/
  15.  
  16. OBJECT rseg
  17.   bend:INT        -> in degrees, often between -10 and +10, 0=straight
  18.   steepness:INT        -> in degrees, often between -40 and +40, 0=flat
  19. ENDOBJECT
  20.  
  21. CONST SEGX=256,SEGY=64,        ->  in pixels
  22.       LOOKAWAY=3,
  23.       SPEED=3,
  24.       WIDTHSTEP=5,
  25.       HORIZON=21
  26.  
  27. DEF road:PTR TO rseg,
  28.     roadlen,            -> #of segments
  29.     cp=0,            -> current pos in segments*pixels
  30.     turn=0,            -> in degrees
  31.     rpos=0,            -> in pixels, -128..127
  32.     sintab[271]:ARRAY OF INT,
  33.     tmap
  34.  
  35. -> both in range -90 to 90
  36.  
  37. #define sin(x) sintab[(x)+90]
  38. #define cos(x) sintab[(x)+180]
  39.  
  40. PROC ahead() IS cp:=cp+(SEGY/SPEED)
  41. PROC back() IS cp:=Bounds(cp-(SEGY/SPEED),0,1000000)
  42. PROC tleft() IS turn:=Bounds(turn-3,-60,60)
  43. PROC tright() IS turn:=Bounds(turn+3,-60,60)
  44. PROC pleft() IS rpos:=Bounds(rpos+3,-128,127)
  45. PROC pright() IS rpos:=Bounds(rpos-3,-128,127)
  46. PROC center() IS (turn:=0) BUT (rpos:=0)
  47.  
  48. PROC render(cbuf)
  49.   DEF cpos,cpospix        -> in segments, pixels in cur segment
  50.   DEF cangle,width=550,middle,ypos,pixstep=100,vp,vpos,vpospix,cbend=0,ccbend,lvpos,lvpospix,cmiddle
  51.   DEF omiddle,nval=0,nposr=0,posadj,te=0,tt=0
  52.   clearmem(cbuf,CWIDTH*HORIZON,$0E0E0E0E)
  53.   clearmem(cbuf+(CWIDTH*HORIZON),BUFS-(CWIDTH*HORIZON),$0F0F0F0F)
  54.   cpospix,cpos:=Mod(cp,SEGY); cpos:=Mod(cpos,roadlen)
  55.   cangle:=road[cpos].steepness
  56.   middle:=CWIDTH/2+(rpos*2)
  57.   ypos:=CHEIGHT-1
  58.   vp:=cp+(LOOKAWAY*SEGY)
  59.   lvpospix,lvpos:=Mod(vp,SEGY); lvpos:=Mod(lvpos,roadlen)
  60.   WHILE width>15
  61.     vpospix,vpos:=Mod(vp,SEGY); vpos:=Mod(vpos,roadlen)
  62.     IF lvpos<>vpos
  63.       cbend:=cbend+(road[lvpos].bend*256)
  64.       IF tt++=0 THEN cbend:=cbend*(SEGY-lvpospix-1)/SEGY
  65.     ENDIF
  66.     ccbend:=cbend+(road[vpos].bend*256*(SEGY-vpospix-1)/SEGY)
  67.     nval,omiddle:=Mod(sin(Bounds(ccbend/256,-90,90))+nval,20000/(vp-cp))
  68.     nposr,posadj:=Mod(WIDTHSTEP*rpos+nposr,256)
  69.     middle:=middle+omiddle-posadj
  70.     cmiddle:=middle+(sin(-turn)*32/ypos)
  71.     rline(cbuf,width,cmiddle,ypos,vpos,vpospix*CWIDTH+tmap)
  72.     ypos--
  73.  
  74.     width:=width-WIDTHSTEP
  75.     vp:=vp+(pixstep/256)
  76.  
  77.     ->fake hills
  78.     ->width:=width-WIDTHSTEP+(road[vpos].steepness/10)
  79.     ->vp:=vp+Div(Mul((pixstep/256),100),(100-road[vpos].steepness))
  80.  
  81.     pixstep:=pixstep/20+pixstep
  82.     lvpos:=vpos
  83.   ENDWHILE
  84. ENDPROC
  85.  
  86. PROC rline(cbuf,width,middle,ypos,vpos,tm)
  87.   DEF x,pstep,pcur=0,end
  88.   x:=middle-(width/2)
  89.   IF (x>=CWIDTH) OR (x+width<=0) THEN RETURN
  90.   cbuf:=ypos*CWIDTH+cbuf
  91.   pstep:=256*1024/width
  92.   IF x<0
  93.     pcur:=-x*pstep
  94.     x:=0
  95.   ENDIF
  96.   end:=Min(CWIDTH-x,256*1024-pcur/pstep)+cbuf+x
  97.   MOVE.L tm,A0
  98.   MOVE.L cbuf,A1
  99.   ADDA.L x,A1
  100.   MOVE.L end,A2
  101.   MOVE.L pcur,D1
  102.   MOVE.L pstep,D2
  103.   MOVEQ #10,D3
  104. tmloop:
  105.   MOVE.L D1,D0
  106.   LSR.L D3,D0
  107.   MOVE.B 0(A0,D0.L),(A1)+
  108.   ADD.L D2,D1
  109.   CMPA.L A2,A1
  110.   BMI.S tmloop
  111. ENDPROC
  112.  
  113. PROC init()
  114.   DEF a
  115.   road:=[0,0,0,0,0,0,0,0,0,0,0,0,
  116.          2,0,4,0,
  117.          6,0,8,0,10,0,12,0,15,0,15,0,15,0,15,0,12,0,10,0,8,0,6,0,
  118.          4,0,2,0,
  119.          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  120.          -2,0,-4,0,
  121.          -6,0,-8,0,-10,0,-10,0,-8,0,-6,0,
  122.          -4,0,-2,0,
  123.          0,0,0,0,0,0,0,0,0,0,0,0,
  124.          0,10,0,15,0,20,0,30,0,20,0,15,0,10,
  125.          0,0,
  126.          0,0,0,15,0,20,0,-20,0,-15,0,0,0,0,0,0
  127.         ]:rseg
  128.   roadlen:=ListLen(road)/2   -> rseg elems
  129.   FOR a:=-90 TO 180 DO sintab[a+90]:=!Fsin(a!/180.0*3.14159)*255.0!
  130.   tmap:={tmaplab}
  131. ENDPROC
  132.  
  133. tmaplab: INCBIN 'e:rr/TEXTUREMAP_ROAD.br.chunky'
  134.  
  135. /*------------------------------------------------------------------------*/
  136.  
  137. PROC main() HANDLE
  138.   DEF dbs,scr=NIL:PTR TO screen,bm:PTR TO bitmap,win=NIL:PTR TO window,
  139.       tbuf2,tbuf3,tbuf2b,tbuf3b,cbuf,dbuf,dbuf2,sigbit,sig,safe=TRUE,a,temp,
  140.       imsg:PTR TO intuimessage,key,frames=0,dframes,fsec,ssec,smic,esec,emic
  141.   IF (dbs:=openreqscreen(CWIDTH,SCHEIGHT,4,'bla'))=NIL THEN Raise()
  142.   scr:=sb_GetScreen(dbs)
  143.   IF (win:=OpenW(0,0,CWIDTH-1,SCHEIGHT-1,
  144.     IDCMP_MOUSEBUTTONS OR IDCMP_VANILLAKEY,
  145.     WFLG_REPORTMOUSE OR WFLG_BORDERLESS OR WFLG_SIMPLE_REFRESH OR WFLG_BACKDROP OR WFLG_ACTIVATE,
  146.     '',scr,15,NIL))=NIL THEN Raise("WIN")
  147.   tbuf2:=NewM(TEMPBUFS+TEMPBUFS,2)
  148.   tbuf3:=tbuf2+TEMPBUFS
  149.   tbuf2b:=NewM(TEMPBUFS+TEMPBUFS,2)
  150.   tbuf3b:=tbuf2b+TEMPBUFS
  151.   NEW cbuf[BUFS]
  152.   NEW dbuf[BUFS]
  153.   NEW dbuf2[BUFS]
  154.   FOR a:=0 TO BUFS-1
  155.     dbuf[a]:=-1
  156.     dbuf2[a]:=-1
  157.   ENDFOR
  158.   FOR a:=1 TO 13 DO SetColour(scr,15-a-1,a*19,a*19,a*14)
  159.   SetColour(scr,0,212,0,9)
  160.   SetColour(scr,14,171,203,255)
  161.   SetColour(scr,15,156,194,0)
  162.   SetRast(scr.rastport,13)
  163.   bm:=sb_NextBuffer(dbs)
  164.   SetRast(scr.rastport,13)
  165.   init()
  166.   IF (sigbit:=AllocSignal(-1))<>-1
  167.     sig:=Shl(1,sigbit)
  168.     CurrentTime({ssec},{smic})
  169.     REPEAT
  170.       render(cbuf)
  171.       IF safe=FALSE
  172.         Wait(sig)
  173.         safe:=TRUE
  174.       ENDIF
  175.       bm:=sb_NextBuffer(dbs)
  176.       c2p4(tbuf3,tbuf2,cbuf,dbuf,bm.planes,FindTask(NIL),sig,gfxbase)
  177.       frames++
  178.       temp:=dbuf; dbuf:=dbuf2; dbuf2:=temp
  179.       temp:=tbuf2; tbuf2:=tbuf2b; tbuf2b:=temp
  180.       temp:=tbuf3; tbuf3:=tbuf3b; tbuf3b:=temp
  181.       IF imsg:=GetMsg(win.userport)
  182.         IF imsg.class=IDCMP_VANILLAKEY
  183.           key:=imsg.code
  184.           SELECT key
  185.             CASE "a"; ahead()
  186.             CASE "b"; back()
  187.             CASE "z"; tleft()
  188.             CASE "x"; tright()
  189.             CASE "n"; pleft()
  190.             CASE "m"; pright()
  191.             CASE "c"; center()
  192.             ->   "q" quits
  193.           ENDSELECT
  194.         ENDIF
  195.         ReplyMsg(imsg)
  196.       ENDIF
  197.       safe:=FALSE
  198.     UNTIL key="q"
  199.     CurrentTime({esec},{emic})
  200.     IF safe=FALSE THEN Wait(sig)
  201.     FreeSignal(sigbit)
  202.   ENDIF
  203. EXCEPT DO
  204.   IF win THEN CloseWindow(win)
  205.   closereqscreen(dbs)
  206.   dframes:=esec-ssec*100+(emic-smic/10000)
  207.   fsec:=frames*10000/dframes
  208.   IF frames THEN WriteF('calculated \d pictures \d.\z\d[2] seconds, giving \d.\z\d[2] f/s\n',frames,Div(dframes,100),Mod(dframes,100),Div(fsec,100),Mod(fsec,100))
  209.   SELECT exception
  210.     CASE "SCR"; WriteF('no screen!\n')
  211.     CASE "REQ"; WriteF('Error: Could not allocate ASL request\n')
  212.     CASE "ASL"; WriteF('Error: Could not open ASL library\n')
  213.   ENDSELECT
  214.   report_exception()
  215. ENDPROC
  216.  
  217. PROC clearmem(mem,size,pat)
  218.   DEF e:REG,a:REG,b:REG,c:REG,d:REG
  219.   e:=size/16-1
  220.   a:=b:=c:=d:=pat
  221.   MOVE.L mem,A0
  222.   ADD.L size,A0
  223. clloop:
  224.   MOVEM.L a/b/c/d,-(A0)
  225.   DBRA e,clloop
  226. ENDPROC
  227.